package san.java.inherit_07;

/**
 * 多态性: 是面向对象中最重要的概念,在 java 中有两种体现:
 *  1. 方法的重载(overload)和重写(overwrite)
 *  2. 对象的多态性 ---可以直接应用在抽象类和接口上
 *
 *  对象的多态: 父类类型的引用可以指向子类的对象: 向上转型(把子类对象转换为父类类型)
 *      0. 通过虚函数机制实现多态(参考C++)
 *      1. 一个变量只能有一种确定的数据类型
 *      2. 一个引用类型变量可能指向(引用)多种不同类型的对象
 *
 * Java引用变量有两个类型: 编译时类型和运行时类型. (C++中多态的实现: 底层是虚函数表)
 *  -- 多态即: 调用同一个方法,却能实现不同的逻辑
 *      1. 方法调用是运行时确定的
 *
 *  总结:
 *      对象多态基于虚函数表实现
 *      前提:
 *          1. 需要存在继承或者实现关系
 *          2. 需要有覆盖操作
 *
 *      成员方法:
 *          编译时支持向上转型
 *          运行时调用实际内存中的对象方法
 *      成员变量:
 *          不具备多态性
 */

public class Polymorphic {

    public static void main(String[] args) {
        // 1. 虚函数机制
        Person p = new Student();
        p.work();  // 调用的Student的work方法
//        p.study();  // Person对象中没有这个方法
    }
}
